<?php
class Admin_StructureController extends Arm_Controller_Action
{
    /**
     * Arm_Navigation
     * @var Arm_Navigation
     */
    public $_navigation = null;
    public function init ()
    {
        $this->_navigation = new Arm_Navigation();
    }

    /**
     * Управления пользовательским меню
     */
    public function userAction ()
    {
        $this->_forward('direct', null, null, 
        array('menu' => 'user'));
    }
    /**
     * Управления административным меню
     */
    public function adminAction ()
    {
        $this->_forward('direct', null, null, 
        array('menu' => 'admin'));
    }
    /**
     * Управления определенным меню в системе.
     */
    public function directAction ()
    {
        $menu = $this->_getParam('menu');
        $this->view->menu = $menu;
        $idActiv = $this->_getParam('idactiv');
        if($idActiv === null) {
            $data = $this->_navigation->getMenuDataOpen(null, $menu, true);
        } else {
            $data = $this->_navigation->getMenuDataOpen($idActiv, $menu, true);
        }
        
        $this->view->data = $data;
    }
    /**
     * добавления корневого раздела
     * Если корневой раздел создается для для admin интерфейса, или для структуры которая
     * содержит в названии admin_ то он будет принадлежать модулю admin
     */
    public function addrootAction ()
    {
        $menu = $this->_getParam('menu');
        $idModule = 0;
        $idMenu = $this->_navigation->getIdMenu($menu);
                if($menu === 'admin' or strpos($menu, 'admin_') === 0) {
                    $idModule = Arm_Module::getInstance()->getIdModule('admin');
                } else {
                    // проверим не приналежит ли меню какомуто модулю.
                    $menuInfo = $this->_navigation->getMenuInfo($idMenu);
                    if($menuInfo['id_module'] !== '0') {
                        $idModule = (int) $menuInfo['id_module'];
                    }
                }
        $this->view->menu = $menu;
        $form = new Admin_Form_StructureNode();
        $this->view->form = $form;
        if($this->getRequest()->isPost() and $form->isValid($this->getPost())) {
                $data = $form->getValues();
                $this->_navigation->createNode($data, 0, $idMenu, $idModule);
                $this->_redirect('/admin/structure/direct/menu/' . $menu);
            
        }
        
    }
    
    /**
     * добавления дочернего элемента
     * Дочерний элемент будет принадлежать модулю к которому принадлежит
     * родетельский элемент.
     */
    public function aadchilderAction()
    {
        // получения id модуля родителя.
        $parent = $this->_navigation->getNodeData($this->_getParam('id'));
        $this->view->uri = $parent['uri'];
        $menu = $this->_getParam('menu');
        $this->view->menu = $menu;
        $form = new Admin_Form_StructureNode();
        $this->view->form = $form;
        if( $this->getRequest()->isPost() and $form->isValid($this->getPost()) ) {
            $data = $form->getValues();
            $this->_navigation->createNode($data, $this->_getParam('id'), 0, $parent['id_module']);
            $this->_redirect('/admin/structure/direct/menu/' . $menu .'/idactiv/' . $this->_getParam('id'));    
        }
    }
    
    /**
     * Удаления узла
     */
    public function deleteAction()
    {
      // Получем id родителя
      $tree = $this->_navigation->_getTree($this->_navigation->getIdMenu($this->_getParam('menu')));
      $parent = $tree->getParent($this->_getParam('id'), true);
      if($parent === false) {
      $idParent = false;
      } else {
      if($parent['level'] === '1') {
         $idParent = false; 
      } else {
         $idParent = $parent['id'];
      }   
      }
      $this->_navigation->delNode($this->_getParam('id'));
      // чистим страницы
      $page = new Arm_Page();
      $page->deletePageNotNavigation();
      if($idParent !== false) {
      $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu') . '/idactiv/' . $idParent);
      } else {
       $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu'));    
      }
    }
    
    /**
     * перемещения верх
     */
    public function upAction()
    {
      $this->_navigation->moveUpNode($this->_getParam('id'));
      $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu') . '/idactiv/' . $this->_getParam('id'));
    }
    
    /**
     * перемещения вниз.
     */
    public function downAction()
    {
      $this->_navigation->moveDownNode($this->_getParam('id'));
      $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu'). '/idactiv/' . $this->_getParam('id'));
    }
    
    /**
     * редактирования пункта меню
     */
    public function editAction()
    {
        $menu = $this->_getParam('menu');
        $this->view->menu = $menu;
        $form = new Admin_Form_StructureNode();
        $this->view->form = $form;
        if($this->getRequest()->isPost() === false) {
            $form->setDefaults($this->_navigation->getNodeData($this->_getParam('id')));
        } elseif ($form->isValid($this->getPost())) {
            $data = $form->getValues();
            $this->_navigation->updateNode($this->_getParam('id'), $data);
            $this->_redirect('/admin/structure/direct/menu/' . $menu . '/idactiv/' . $this->_getParam('id'));
        } 
     }
    
    /**
     * Добавления страницы на существующий пункт меню.
     * Страница принадлежит модулю к которому относиться пункт меню.
     * 
     */
    public function pageaddAction()
    {
        $id = $this->_getParam('id');
        // получаем данные по элементу
        $node = $this->_navigation->getNodeData($id);
        // формируем форму добавляем данные в нее id модуля 
        // и так дальше.
        $form = new Admin_Form_Page();
        $this->view->form = $form;
        if($this->getRequest()->isPost() and $form->isValid($this->getPost())) {
            // запишем страницу
            $page = new Arm_Page();
            $data = $form->getValues();
            $data[Arm_Page::URI]       = $node['uri'];
            $data[Arm_Page::ID_MODULE] = $node['id_module'];
            $page->create($data);
            $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu') . '/idactiv/' . $this->_getParam('id'));
        }
        
    }
    
    /**
     * Редактирования страницы
     */
    public function pageeditAction()
    {
       $id   = $this->_getParam('id');
       $node = $this->_navigation->getNodeData($id);
       $page = new Arm_Page();
       $form = new Admin_Form_Page();
       $this->view->form = $form;
       $dataPage = $page->getPage($node['uri'], null, true);    
       if($this->getRequest()->isPost() === false) {
           $form->setDefaults($dataPage);
       }else if($form->isValid($this->getPost())) {
            // запишем страницу
            $data = $form->getValues();
            $page->upDate($data, $dataPage['id']);
            $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu') . '/idactiv/' . $this->_getParam('id'));
        }  
    }
    
    /**
     * Удаления страницы
     */
    public function pagedeleteAction()
    {
       $id = $this->_getParam('id');
       $node = $this->_navigation->getNodeData($id);
       $page = new Arm_Page();
       $page->deletePage(null, $node['uri']);    
       $this->_redirect('/admin/structure/direct/menu/' . $this->_getParam('menu') . '/idactiv/' . $this->_getParam('id'));  
    }
    
    /**
     * Управления страницами
     */
    public function pageAction()
    {
       $this->setDataPageView();
    }
    
    /**
     * Управления другими меню
     */
    public function otherAction()
    {
      $this->view->data = $this->_navigation->getMenusNotSystemStructure();
      $menu = $this->_getParam('menu');
      if($menu !== null) {
           $this->_forward('direct', null, null, 
        array('menu' => $menu));
      }
    }
    
    public function otherdelAction()
    {
       $this->_navigation->delMenu($this->_getParam('id'));
       $this->addFlashMessender(Arm_Translate::_('Меню удалено'));
       // чистим возможные страницы
       $page = new Arm_Page();
       $page->deletePageNotNavigation();
       $this->_redirect('/admin/structure/other');
    }
    
    /**
     * Создания новой структуры.
     */
    public function createstructureAction()
    {
      $form = new Admin_Form_Structure();
      $this->view->form = $form;
      if($this->getRequest()->isPost() and $form->isValid($this->getPost())) {
          $data = $form->getValues();
          $this->_navigation->createMenu($data['label'], $data['title'], $data['id_module']);
          $this->addFlashMessender(Arm_Translate::_('Меню %s созданно', $data['label']));
          $this->_redirect('/admin/structure/other');
      }
    }
}